"""
支付工具模块
提供支付相关的签名生成和验证等工具函数
"""
import hashlib
import hmac
from typing import Dict, Any


def generate_signature(params: Dict[str, Any], secret: str) -> str:
    """
    生成支付签名
    按照支付接口要求的格式生成签名，用于验证请求的完整性和真实性
    
    Args:
        params (Dict[str, Any]): 需要签名的参数字典
        secret (str): 签名密钥
        
    Returns:
        str: 生成的签名字符串，大写MD5哈希值
    """
    # 对参数按照键名进行排序
    sorted_params = sorted(params.items())
    
    # 构建参数字符串（排除空值）
    sign_str = '&'.join([f"{k}={v}" for k, v in sorted_params if v])
    
    # 添加密钥到字符串末尾
    sign_str += f"&key={secret}"
    
    # 生成MD5哈希值并转换为大写
    return hashlib.md5(sign_str.encode()).hexdigest().upper()


def verify_signature(params: Dict[str, Any], signature: str, secret: str) -> bool:
    """
    验证支付签名
    安全地验证签名是否匹配，防止计时攻击
    
    Args:
        params (Dict[str, Any]): 接收到的参数字典
        signature (str): 需要验证的签名
        secret (str): 签名密钥
        
    Returns:
        bool: 签名是否验证通过
    """
    # 生成期望的签名
    expected_signature = generate_signature(params, secret)
    
    # 使用hmac.compare_digest进行时间恒定的字符串比较，防止计时攻击
    return hmac.compare_digest(expected_signature, signature)